import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getTimeStamp, setTimeStamp } from './auth'
const TimeOut = 5000 // 定义超时时间

// create an axios instance
// 创建实例,可以有多个服务
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// 请求拦截
// request interceptor
service.interceptors.request.use(config => {
  // 如果有token，就统一传token
  if (store.getters.token) {
    if (isCheckTimeOut()) {
      // 超时了，执行退出操作，删除token，和用户信息
      store.dispatch('user/logout')
      // 跳转到登录页
      router.push('/login')
      return Promise.reject(new Error('token超时了'))
    }
    // const TimeOut = 3600 // 定义超时时间
    // const loginTime = localStorage.getItem('time')
    // const now = Date.now()
    // if ((now - loginTime) > TimeOut) {
    //   // 超时了，执行退出操作，删除token，和用户信息
    //   store.dispatch('user/logout')
    //   // 跳转到登录页
    //   router.push('/login')
    //   return Promise.reject(new Error('token超时了'))
    // } else {
    //   localStorage.setItem('time', Date.now()) // 比如设置了超时时间是一个小时，如果刚好半小时页面操作了一下，那么应该重新计时
    // }
    config.headers.Authorization = 'Bearer ' + store.getters.token
    setTimeStamp()
  }

  return config
}, err => {
  return Promise.reject(new Error(err))
}
)

// response interceptor
// 响应拦截
service.interceptors.response.use(res => {
  console.log('网络层面成功', res)
  // 解构res.data里面的数据继续判断
  const { success, data, message } = res.data
  if (success) {
    // 成功
    console.log('数据层面成功')
    // 成功提示
    // Message.success(message)
    // 解构以后返回
    return data
  } else {
    // 失败
    console.log('数据层面失败')
    // 报错提示
    Message.error(message)
    // 组织当前的请求
    // 数据层面失败应该用promise.reject返回一个错误对象,不仅能知道错误，还能知道在哪里错误，有助于开发
    // 用Promise.reject就可以阻止跳转，因为被reject了，不加的话虽然提示报错信息，但页面仍然跳转
    return Promise.reject(new Error(message))
  }
}, err => {
  console.log('网络层面失败', err)
  console.dir(err)
  // token超时的被动处理，由后台告诉我们
  if (err.response && err.response.data && err.response.data.code === 10002) {
    store.dispatch('user/logout')
    router.push('/login')
  }
  // 提示错误
  Message.error(err.message)
  return Promise.reject(new Error(err.message))
})
// 检查是否
// 主动处理token超时
function isCheckTimeOut() {
  const currentTime = Date.now()// 当前时间戳
  const timeStamp = getTimeStamp() // 缓存时间戳
  // 1个小时过期
  return (currentTime - timeStamp) / 1000 > TimeOut
}

export default service
